package com.xteam.ecsystem.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.tangkf.utils.CommonUtils;
import com.xteam.ecsystem.base.WebService;
import com.xteam.tools.config4j.cfg.ConfigBuilder;
import com.xteam.tools.config4j.cfg.ConfigNode;

/**
 * 配置信息读取
 * @author 汤垲峰
 */
public class AppConfig {
	// 根节点
	private static ConfigNode root;
	
	// 配置特殊邮箱
	public static Map<String, String> specialEmails = new HashMap<String, String>();
	
	/**
	 * 初始化配置信息
	 * @author 汤垲峰 2009-2-20
	 * @param cfgpath
	 */
	static {
		AppConfig.initialize();
	}
	
	/**
	 * 初始化配置信息
	 * @author 汤垲峰 2009-2-20
	 */
	public static void initialize() {
		initialize("/app-config.xml");
	}
	
	/**
	 * 初始化配置信息
	 * @author 汤垲峰 2009-2-20
	 * @param cfgpath
	 */
	public static void initialize(String cfgpath) {
		try {
			root = new ConfigBuilder(cfgpath).getRoot();
			
			// 加载特殊邮箱的配置
			ConfigNode mailConfig = root.getOneChildByName("mail-special-config");
			List<ConfigNode> emails = mailConfig.getChildrenByName("mail-item");
			
			for (ConfigNode email : emails) {
				// 加载所有特殊邮箱
				specialEmails.put(email.getProperty("suffix"), email.getNodeValue());
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 获取虚拟路径。
	 * @author ls 2013年3月11日 16:21:47
	 * @return
	 */
	public static String getVirtualPath() {
		ConfigNode cn = root.getOneChildByName("upload-config").getOneChildByName("virtual-path");
		return cn.getNodeValue();
	}
	
	/**
	 * 获取实际路径。
	 * @author ls 2013年3月11日 16:21:47
	 * @return
	 */
	public static String getRealPath() {
		ConfigNode cn = root.getOneChildByName("upload-config").getOneChildByName("real-path");
		return cn.getNodeValue();
	}
	
	/**
	 * 获取产品图片保存路径。
	 * @author Chrise 2012-6-27
	 * @return
	 */
	public static String getProductImagePath() {
		ConfigNode cn = root.getOneChildByName("upload-config").getOneChildByName("product-image");
		return cn.getNodeValue();
	}
	
	/**
	 * 获取文章附件保存路径。
	 * @author Chrise 2012-6-27
	 * @return
	 */
	public static String getArticleAttachPath() {
		ConfigNode cn = root.getOneChildByName("upload-config").getOneChildByName("article-attach");
		return cn.getNodeValue();
	}
	
	/**
	 * 获取文章图片保存路径。
	 * @author Chrise 2012-6-27
	 * @return
	 */
	public static String getArticleImagePath() {
		ConfigNode cn = root.getOneChildByName("upload-config").getOneChildByName("article-image");
		return cn.getNodeValue();
	}
	
	/**
	 * 获取广告图片保存路径。
	 * @author Chrise 2012-6-27
	 * @return
	 */
	public static String getAdvertiseImagePath() {
		ConfigNode cn = root.getOneChildByName("upload-config").getOneChildByName("advertise-image");
		return cn.getNodeValue();
	}
	
	/**
	 * 获取商品品牌图片保存路径。
	 * @author liuzhi 2012-7-03
	 * @return
	 */
	public static String getBrandImagePath() {
		ConfigNode cn = root.getOneChildByName("upload-config").getOneChildByName("brand-image");
		return cn.getNodeValue();
	}
	
	/**
	 * 获取商品供货商图片保存路径。
	 * @author liuzhi 2012-7-03
	 * @return
	 */
	public static String getSupplierImagePath() {
		ConfigNode cn = root.getOneChildByName("upload-config").getOneChildByName("supplier-image");
		return cn.getNodeValue();
	}
	
	/**
	 * 获取购物券图片保存路径。
	 * @author liuzhi 2012-7-03
	 * @return
	 */
	public static String getCouponImagePath() {
		ConfigNode cn = root.getOneChildByName("upload-config").getOneChildByName("coupon-image");
		return cn.getNodeValue();
	}
	
	/**
	 * 获得等级图标保存路径
	 * @author liuzhi 2013-12-12
	 * @return
	 */
	public static String getGradeImagePath() {
		ConfigNode cn = root.getOneChildByName("upload-config").getOneChildByName("grade-image");
		return cn.getNodeValue();
	}
	
	/**
	 * 获取会员留言图片保存路径。
	 * @author ls 2013年3月12日 17:10:20
	 * @return
	 */
	public static String getMessageImagePath() {
		ConfigNode cn = root.getOneChildByName("upload-config").getOneChildByName("message-image");
		return cn.getNodeValue();
	}
	
	/**
	 * 获取资源根目录名称。
	 * @author Chrise 2012-6-27
	 * @return
	 */
	public static String getResRootName() {
		ConfigNode cn = root.getOneChildByName("www-config").getOneChildByName("res-root-name");
		return cn.getNodeValue();
	}
	
	/**
	 * 获取资源根目录相对路径。
	 * @author Administrator
	 * @return
	 */
	public static String getResRootRelation() {
		ConfigNode cn = root.getOneChildByName("www-config").getOneChildByName("res-root-relation");
		return cn.getNodeValue();
	}
		
	/**
	 * 获取资源根目录路径。
	 * @author Chrise 2012-6-27
	 * @return
	 */
	public static String getResRootPath() {
		ConfigNode cn = root.getOneChildByName("www-config").getOneChildByName("res-root-path");
		return cn.getNodeValue();
	}
	
	/**
	 * 获取模板根目录名称。
	 * @author Chrise 2012-6-27
	 * @return
	 */
	public static String getTplRootName() {
		ConfigNode cn = root.getOneChildByName("www-config").getOneChildByName("tpl-root-name");
		return cn.getNodeValue();
	}
	
	/**
	 * 获取模板根目录路径。
	 * @author Chrise 2012-6-27
	 * @return
	 */
	public static String getTplRootPath() {
		ConfigNode cn = root.getOneChildByName("www-config").getOneChildByName("tpl-root-path");
		return cn.getNodeValue();
	}
	
	/**
	 * 是否远程同步。
	 * @author Chrise 2012-6-27
	 * @return
	 */
	public static boolean isRemoteSync() {
		ConfigNode cn = root.getOneChildByName("sync-config").getOneChildByName("is-remote");
		return CommonUtils.parseBoolean(cn.getNodeValue());
	}
	
	/**
	 * 获取同步网络服务。
	 * @author Chrise 2012-6-27
	 * @return
	 */
	public static List<WebService> getSyncWebService() {
		List<WebService> list = new ArrayList<WebService>();
		
		List<ConfigNode> cns = root.getOneChildByName("sync-config").getOneChildByName("web-service").getChildrenByName("item");
		for (ConfigNode cn : cns) {
			String name = cn.getProperty("name");
			String value = cn.getNodeValue();
			if (name == null || "".equals(name)) name = value;
			
			list.add(new WebService(name, value));
		}
		
		return list;
	}
	
	/**
	 * 获取购物车商品失效时间
	 * @author ls 2013年2月27日 14:55:07
	 * @return
	 */
	public static int getCartMaxAge() {
		ConfigNode cn = root.getOneChildByName("cart-config").getOneChildByName("cart-maxage");
		return CommonUtils.parseInt(cn.getNodeValue());
	}
	
	/**
	 * 返回整个节点
	 * @author 汤垲峰 2009-11-16
	 * @param nodeType
	 * @return
	 */
	public static ConfigNode getNode(String nodeType) {
		ConfigNode cn = root.getOneChildByName(nodeType);
		return cn;
	}
	
	/**
	 * 返回的孩子节点表
	 * @author 汤垲峰 2009-11-16
	 * @param nodeType
	 * @param name
	 * @return
	 */
	public static List<ConfigNode> getNodeChildren(String nodeType, String name) {
		ConfigNode cn = root.getOneChildByName(nodeType);
		return cn.getChildrenByName(name);
	}
	
	/**
	 * 返回指定类型的，指定属性的值
	 * @author 汤垲峰 2009-11-11
	 * @param nodeType
	 * @param keyName
	 * @return
	 */
	public static String getNodeProperty(String nodeType, String keyName) {
		ConfigNode cn = root.getOneChildByName(nodeType);
		return cn.getProperty(keyName);
	}
	
	/**
	 * 返回整形数字
	 * @author 汤垲峰 2009-11-25
	 * @param nodeName
	 * @param key
	 * @return
	 */
	public static int getNodePropertyInt(String nodeName, String key) {
		String intvalue = getNodeProperty(nodeName, key);
		return CommonUtils.parseInt(intvalue);
	}
	
	/**
	 * 返回整形属性
	 * @author 汤垲峰 2009-12-14
	 * @param nodeType
	 * @param keyName
	 * @return
	 */
	public static String getProperty(String nodeType, String keyName) {
		return getNodeProperty(nodeType, keyName);
	}
	
	/**
	 * 返回整形属性
	 * @author 汤垲峰 2009-12-14
	 * @param nodeType
	 * @param keyName
	 * @return
	 */
	public static int getIntProperty(String nodeType, String keyName) {
		return CommonUtils.parseInt(getNodeProperty(nodeType, keyName));
	}
	
	/**
	 * 返回浮点型属性
	 * @author 汤垲峰 2009-12-14
	 * @param nodeType
	 * @param keyName
	 * @return
	 */
	public static double getDoubleProperty(String nodeType, String keyName) {
		return CommonUtils.parseFloat(getNodeProperty(nodeType, keyName));
	}
	
	/**
	 * 返回布尔型
	 * @author 汤垲峰 2009-11-25
	 * @param nodeName
	 * @param key
	 * @return
	 */
	public static boolean getNodePropertyBoolean(String nodeName, String key) {
		String bvalue = getNodeProperty(nodeName, key);
		return CommonUtils.parseBoolean(bvalue);
	}
	
	/**
	 * 返回指定的节点序列下的属性
	 * @author 汤垲峰 2009-11-12
	 * @param names
	 * @param key
	 * @return
	 */
	public static String getProperty(String[] names, String key) {
		ConfigNode cn = null;
		for (int i = 0; i < names.length; i++) {
			if (cn == null) {
				cn = root.getOneChildByName(names[i]);
			} else {
				cn = cn.getOneChildByName(names[i]);
			}
		}
		return cn.getProperty(key);
	}
	
	/**
	 * 返回指定类型的制定字段值
	 * @author 汤垲峰 2009-11-11
	 * @param nodeType
	 * @param nodeName
	 * @return
	 */
	public static String getNodeValue(String nodeType, String nodeName) {
		ConfigNode cn = root.getOneChildByName(nodeType);
		return cn.getOneChildByName(nodeName).getNodeValue();
	}
}
